Mirroring: Reversing Order of a Vector's Components

Given an $N$-dimensional euclidean vector space, the reversal of a vectors components can be produced by $k$-reflections in hyperplanes normal to $n_i$

$$ a^{'} = -(n_1 n_{2}\cdots n_{k }) a (n_k \cdots n_2 n_1 )$$

where $$ k = N/2 $$

and

$$ n_i = e_i-e_{N-i} $$

Note that for vector spaces with an odd number of dimensions the middle component cancels it self out. Bellow are some explicit examples, illustrating the operation for various dimensions.


In [37]:
from sympy import * 
from galgebra.ga import Ga
import sympy

2D


In [38]:
(ga,e1,e2) = Ga.build('e1 e2',g=[1,1])
a=ga.mv('a','vector')

n = sqrt(2)/2*(e1-e2)
-n*a*n


Out[38]:
\begin{equation*} a^{2} e_{1} + a^{1} e_{2} \end{equation*}

3D


In [39]:
(ga,e1,e2,e3) = Ga.build('e1 e2 e3',g=[1,1,1])
a=ga.mv('a','vector')


n = sqrt(2)/2*(e1-e3)
-n*a*n


Out[39]:
\begin{equation*} a^{3} e_{1} + a^{2} e_{2} + a^{1} e_{3} \end{equation*}

4D


In [40]:
(ga,e1,e2,e3,e4) = Ga.build('e1 e2 e3 e4',g=[1,1,1,1])
a=ga.mv('a','vector')
n = sqrt(2)/2*(e1-e4)
m = sqrt(2)/2*(e2-e3)

m*n*a*n*m


Out[40]:
\begin{equation*} a^{4} e_{1} + a^{3} e_{2} + a^{2} e_{3} + a^{1} e_{4} \end{equation*}

5D


In [41]:
(ga,e1,e2,e3,e4, e5) = Ga.build('e1 e2 e3 e4 e5',g=[1,1,1,1,1])
a=ga.mv('a','vector')
n = sqrt(2)/2*(e1-e5)
m = sqrt(2)/2*(e2-e4)

a_flip = m*n*a*n*m
a_flip


Out[41]:
\begin{equation*} a^{5} e_{1} + a^{4} e_{2} + a^{3} e_{3} + a^{2} e_{4} + a^{1} e_{5} \end{equation*}

6D


In [42]:
(ga,e1,e2,e3,e4, e5, e6) = Ga.build('e1 e2 e3 e4 e5 e6',g=[1,1,1,1,1,1])
a=ga.mv('a','vector')
n = sqrt(2)/2*(e1-e6)
m = sqrt(2)/2*(e2-e5)
o = sqrt(2)/2*(e3-e4)

a_flip = -m*n*o*a*o*n*m
a_flip


Out[42]:
\begin{equation*} a^{6} e_{1} + a^{5} e_{2} + a^{4} e_{3} + a^{3} e_{4} + a^{2} e_{5} + a^{1} e_{6} \end{equation*}

Ok, lets write a function for n-D


In [43]:
def mirror(a):
    e = a.Ga.mv_basis  # vector basis
    N = len(e)       # dimension of space
    n = range(N-1)   # reflection vectors
    a_mir = a        # outputs
    for i in range(len(e)/2):
        n[i] = sqrt(2)/2* (e[i] - e[N-1-i])
        a_mir = -n[i]*a_mir*n[i]
    return a_mir

a_mir = mirror(a)
a_mir


Out[43]:
\begin{equation*} a^{6} e_{1} + a^{5} e_{2} + a^{4} e_{3} + a^{3} e_{4} + a^{2} e_{5} + a^{1} e_{6} \end{equation*}

Even and Odd modes

A discrete function of length $N$ can be thought of as an $N$-dimensional vector. Any such function may broken up into even and odd modes.

\begin{eqnarray*} a &=& {\frac{1}{2} (a+a^{'})} + \frac{1}{2} (a-a^{'})\\ a &=& a_e + a_o \end{eqnarray*}

where $a^{'}$ is the mirrored version of $a$, as described above.


In [47]:
half = Rational(1,2)
even = lambda a: half*(a+mirror(a))
odd = lambda a: half*(a-mirror(a))

2D


In [53]:
(ga,e1,e2) = Ga.build('e1 e2',g=[1,1])

a = ga.mv('a','vector')
a_e = even(a)
a_e


Out[53]:
\begin{equation*} \left ( \frac{a^{1}}{2} + \frac{a^{2}}{2}\right ) e_{1} + \left ( \frac{a^{1}}{2} + \frac{a^{2}}{2}\right ) e_{2} \end{equation*}

In [49]:
a_o = odd(a)
a_o


Out[49]:
\begin{equation*} \left ( \frac{a^{1}}{2} - \frac{a^{2}}{2}\right ) e_{1} + \left ( - \frac{a^{1}}{2} + \frac{a^{2}}{2}\right ) e_{2} \end{equation*}